<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>JavaScript解释器对内存进行的垃圾回收</title>
	</head>
	<body>
		<script type="text/javascript">
			/* javascript解释器有自己的内存管理机制，可以自动对内存进行垃圾回收(garbage collection).
			 这意味着程序可以按需创建对象，程序员则不必担心这些对象的销毁和内存回收。
			 当不再有任何引用指向一个对象，解释器就会知道这个对象没用了，然后自动回收它所用的内存资源。*/
			 
			/* JavaScript 采用语法作用域(lexical scoping),不在任何函数内声明的*/
			 
			/* JavaScript 采用的是IEEE754标准定义的64位浮点格式表示数字能表示的最大数值+—1.7976931348623157*10的308次方
			 最小值是+-5*10的-324次方。
			 而在JavaScript中的数字格式，能够表示的整数范围是-2的53次方~2的53次方 */
			
			
			
			
			/* 作为属性的变量
				当使用var声明一个全局变量时，创建的这个属性是不可配置的，因此该变量无法使用delete运算符删除。
				如果没用用严格的格式给一个未声明变量赋值的话，JavaScript会自动创建一个全局变量，以这种方式创建的变量是全局对象的正常的可配值属性，并可删除。*/
				/* eg: 	var truevar = 1;		//声明一个不可删除的全局变量
						fakevar = 2;			//创建全局对象的一个可删除属性
						this.fakevar2 = 3;		//同上
						delete truevar			//结果为： false 变量并没有被删除
						delete fakevar			//结果为： true 变量被删除
						delete fakevar2			//结果为： true 变量被删除 */
			
			如何手动触发 JavaScript 垃圾回收行为？
			转载自：https://github.com/cssmagic/better-dollar/issues/3

			垃圾回收，即 garbage collect，简称 “GC”。

			这里的 “手动” 指有效地、显式地、可控地触发浏览器 JavaScript 引擎的垃圾回收行为，比如通过点击页面中的按钮来调用 JS 方法，或使用浏览器提供的功能。

			/* IE */
			IE 实际上提供了一个未公开的 JS 方法 CollectGarbage()。至少在 IE8 仍然存在此方法。

			if (typeof window.CollectGarbage === 'function') {
				CollectGarbage()
			}
			
			/* Opera */
			旧版（非 Blink 内核）的 Opera 7+ 似乎也有一个手动触发 GC 的 JS 方法。

			window.opera.collect()
			
			/* Firefox */
			有文章 提到了两种方法：

			Components.utils.forceGC()
			window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
				.getInterface(Components.interfaces.nsIDOMWindowUtils)
				.garbageCollect()
			区别在于前者只触发 JS 引擎内的垃圾回收，而后者还可以处理 XPCOM 对象的回收。对分析网页内的垃圾回收行为来说，前者足够了。

			在最新的 Firefox 中，上述方法可能已失效（无法在控制台直接调用），也可能这些方法只能在 Firefox 扩展中使用。我稍后会找低版本的 Firefox 做更多测试。

			更新：在 Firefox 3.6 中也无法直接使用上述方法。

			更新：有一个扩展 MemChaser 似乎允许手动触发 GC。

			更新：Firefox 在 about:memory 页面中原生提供了详细的内存监控功能，但结合上述扩展使用似乎更方便一些。

			/* Chrome */
			Chrome 的 DevTools 对 JavaScript 的垃圾回收和内存泄漏提供了强大的分析工具。在 DevTools 的 “Timeline” 页面可以手动点击 “CollectGarbage” 按钮来触发 GC。
				
		</script>
	</body>
</html>
